package com.foftact.etfrank.mapper;

import com.foftact.etfrank.ETFRank;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * ETF排行Mapper接口
 * 用于操作etf_rank表
 */
@Mapper
public interface ETFRankMapper {
    /**
     * 插入单条ETF排行数据
     * @param etfRank ETF排行数据对象
     * @return 插入的行数
     */
    int insert(ETFRank etfRank);

    /**
     * 批量插入ETF排行数据
     * @param etfRankList ETF排行数据列表
     * @return 插入的行数
     */
    int batchInsert(@Param("list") List<ETFRank> etfRankList);

    /**
     * 根据基金代码和日期查询ETF排行数据
     * @param fundCode 基金代码
     * @param navDate 净值日期
     * @return ETF排行数据对象
     */
    ETFRank selectByCodeAndDate(@Param("fundCode") String fundCode, @Param("navDate") Date navDate);

    /**
     * 查询指定日期的ETF排行数据
     * @param navDate 净值日期
     * @return ETF排行数据列表
     */
    List<ETFRank> selectByDate(Date navDate);

    /**
     * 查询最近N天的ETF排行数据
     * @param days 天数
     * @return ETF排行数据列表
     */
    List<ETFRank> selectRecentDays(int days);

    /**
     * 查询所有ETF排行数据
     * @return ETF排行数据列表
     */
    List<ETFRank> selectAll();

    /**
     * 根据基金代码和日期更新ETF排行数据
     * @param etfRank ETF排行数据对象
     * @return 更新的行数
     */
    int updateByCodeAndDate(ETFRank etfRank);

    /**
     * 插入或更新ETF排行数据
     * @param etfRank ETF排行数据对象
     * @return 操作的行数
     */
    int insertOrUpdate(ETFRank etfRank);

    /**
     * 根据日期删除ETF排行数据
     * @param navDate 净值日期
     * @return 删除的行数
     */
    int deleteByDate(Date navDate);

    /**
     * 删除指定日期之前的ETF排行数据
     * @param date 日期
     * @return 删除的行数
     */
    int deleteBeforeDate(Date date);

    /**
     * 按增长率排序查询ETF排行数据
     * @paramx navDate 净值日期
     * @param orderByField 排序字段
     * @param orderByDirection 排序方向
     * @param limit 查询数量
     * @return ETF排行数据列表
     */
    List<ETFRank> selectByRank(/** @Param("navDate") Date navDate,**/
                               @Param("orderByField") String orderByField, 
                               @Param("orderByDirection") String orderByDirection, 
                               @Param("limit") Integer limit);
}